Attribute Module_Name = "Module1"
// wps js 脚本
//=================================================================================================
// FillCol (c) 2023 by x01
//------------------------
//  1.如满足条件，则将 sh1_name 中相应项填充到 sh2_name 中，汇总专用。
//  2.条件及操作可根据实际作相应调整。
// 参数: 
//  sh1_name: 原表名称 
//  sh1_r1: 原表起始行, sh1_r2: 原表结束行, sh1_c1: 原表代码列, sh1_c2: 源表填充列
//  sh2_name: 目的表名称
//  sh2_r1: 目的表起始行, sh2_r2: 目的表结束行, sh2_c1: 目的表起始列, sh2_c2: 目的表结束列
// 用法示例:
//      FillCol("1",1,300,8,13,"T",2,200,2,5)
//===================================================================================================
function FillCol(sh1_name, sh1_r1, sh1_r2, sh1_c1, sh1_c2, sh2_name, sh2_r1, sh2_r2, sh2_c1, sh2_c2, added)
{
	let wb = ThisWorkbook;
	let sheet1 = wb.Sheets(sh1_name);
	let sheet2 = wb.Sheets(sh2_name);

	Console.log("正在填充单列, 请等待... ")
	for (var i=sh1_r1; i<=sh1_r2; i++) {
		for (var j=sh2_r1; j<=sh2_r2; j++) {
			var c1 = sheet1.Cells(i, sh1_c1).Value();
			var c2 = sheet2.Cells(j, sh2_c1).Value();
			if (!c1) continue;
			if (c1 == c2) {
//				Console.log(c1 + " " + c2);
				var a = sheet1.Cells(i,sh1_c2).Value();
				var b = sheet2.Cells(j, sh2_c2).Value();
				if (added) {
					if (isNaN(Number(a))) continue;
					if (isNaN(Number(b))) b = 0;
					sheet2.Cells(j, sh2_c2).Value2 = a + b;
				} else {
					sheet2.Cells(j, sh2_c2).Value2 = a;
				}
				
			}
		}
	}
	Console.log("单列填充完毕!!")
}

function 填充单列()
{
	FillCol("t", 	// 原表名
			2,		// 起始行
			400,	// 结束行
			1,		// 代码列
			5,		// 填充列
			"10",	// 目的表名
			2,		// 起始行
			400,	// 结束行
			3,		// 代码列
			9,		// 填充列
			true	// true: 累加, false: 不累加
	);
}

// 用法示例:
// 		Fill_9q("1", 4, 3, 2, 100, 10, "明细", 4, 5, 6, 31, 7, 173)
function Fill_9q(sh1_九丘表名, sh1_活动列, sh1_客户列, sh1_起始行, sh1_结束行, sh1_数量列, 
	sh2_汇总表名, sh2_活动列, sh2_客户行, sh2_起始行, sh2_结束行, sh2_起始列, sh2_结束列)
{
	let wb = ThisWorkbook;
	let sheet1 = wb.Sheets(sh1_九丘表名);
	let sheet2 = wb.Sheets(sh2_汇总表名);
	
	var destvalue = 0;
	Console.log("正在从九丘网填充到汇总, 请等待... ")
	for (var r2=sh2_起始行; r2<=sh2_结束行; r2++) {
		var hd = sheet2.Cells(r2,sh2_活动列).Value();
		if (!hd) continue
		Console.log(hd + " 正在录入...");
		
		for (var c2=sh2_起始列; c2<=sh2_结束列; c2++) {
			destvalue  = 0; //sheet2.Cells(r2,c2)
			for(var r1=sh1_起始行; r1<=sh1_结束行; r1++) {
				if (hd != sheet1.Cells(r1,sh1_活动列).Value()) continue;
				var src_value = sheet1.Cells(r1, sh1_数量列).Value();
				if (isNaN(Number(src_value))) continue;
				var src_clientvalue = sheet1.Cells(r1,sh1_客户列).Value()
				var src_codevalue = sheet1.Cells(r1,sh1_活动列).Value()
				if (!src_clientvalue || !src_codevalue) continue;
				var dest_clientvalue = sheet2.Cells(sh2_客户行, c2).Value()
				var dest_codevalue = sheet2.Cells(r2,sh2_活动列).Value()
				if (!dest_clientvalue || !dest_codevalue) continue;
				if (src_clientvalue == dest_clientvalue && src_codevalue == dest_codevalue) {
					destvalue += src_value
				}
			}
			if (destvalue == 0) continue;
			sheet2.Cells(r2,c2).Value2 = destvalue;
			
		}
	}
	Console.log("九丘网到汇总填充完毕!!")
}

function 填充九丘()
{
	Fill_9q("1", 	// 九丘表名
			4, 		// 活动列
			12, 	// 客户列
			2, 		// 起始行
			100, 	// 结束行
			10, 	// 数量列
			"汇总", // 汇总表名
			4,		// 活动列
			3, 		// 客户行
			6, 		// 起始行
			31,		// 结束行
			7, 		// 起始列
			92		// 结束列
	);
}

//'========================================================================
//' Fill_hz (c) 2015 by x01
//'------------------------
//'  1.将明细 sh1 各学校数字填入相应汇总表 sh2.
//'  2.参数说明：
//'       sh1_r1,sh1_r2,sh1_c1,sh1_c2:报订开始行，结束行，开始列，结束列
//'       sh1_codeCol: 征订代码列
//'       sh1_clientIdCol: 客户编号列
//'       sh2_r1,sh2_r2,sh2_c1,sh2_c2: 汇总表开始行，结束行，开始列，结束列
//'       sh2_codeCol: 征订代码列
//'       sh2_clientIdRow: 汇总表客户编号所在行
//'   example: FillAll Sheet1,3,122,3,1,10,Sheet33,5,34,6,42,4,3
//'========================================================================
function Fill_hz(sh1_name, sh1_r1, sh1_r2, sh1_c1, sh1_c2, sh1_codeCol, sh1_clientIdRow, 
				 sh2_name, sh2_r1, sh2_r2, sh2_c1, sh2_c2, sh2_codeCol, sh2_clientIdRow) 
{
	let wb = ThisWorkbook;
	let sh1 = wb.Sheets(sh1_name);
	let sh2 = wb.Sheets(sh2_name);
	
	Console.log("正在把明细填充到汇总中, 请等待...")
    for (var i = sh1_r1; i<= sh1_r2; i++) {
	    for (var j = sh1_c1; j<= sh1_c2; j++) {
	    	var srcval = sh1.Cells(i, j).Value2;
	    	if (isNaN(srcval)) continue;
	        for (var y = sh2_r1; y <= sh2_r2; y++) {
	            for (var x = sh2_c1; x<= sh2_c2; x++) {
	            	var code1 = sh1.Cells(i, sh1_codeCol).Value();
	            	var code2 = sh2.Cells(y, sh2_codeCol).Value();
	            	var client1 = sh1.Cells(sh1_clientIdRow, j).Value();
	            	var client2 = sh2.Cells(sh2_clientIdRow, x).Valie();
	            	if (!code1 || !code2 || !client1 || !client2) continue;
	                if (code1 == code2 && client1 == client2) {
	                    var destval = sh2.Cells(y, x).Value2;
	                    if (isNaN(destval)) destval = 0;                     
	                    sh2.Cells(y, x).Value2 = srcval + destval;
	                }
	            }
	        }
	    }
    }
    Console.log("明细填充到汇总完毕!");
 }
    
function 填充汇总()
{
	Fill_hz("明细", 
			6, 
			200, 
			7, 
			200, 
			5, 
			3, 
			"汇总", 
			6, 
			200, 
			7, 
			200, 
			5, 
			3													
	);
}

//'=====================================================================
//' SubTotal (c) 2014 by x01
//'-------------------------
//'  求 (单价 * 册数) 的累加小合计
//'=====================================================================
function SubTotal(sheet_name, startRow, endRow, startCol, endCol, priceCol, outRow)
{
	let wb = ThisWorkbook;
	let sheet = wb.Sheets(sheet_name);
	
    for (var c = startCol; c <= endCol; c++) {
        var s = 0
        for (var r = startRow; r<= endRow; r++) {
        	var price = sheet.Cells(r, priceCol).Value2;
        	var number = sheet.Cells(r, c).Value2
        	if (isNaN(price) || isNaN(number)) continue
            s += number * price         
        }
        sheet.Cells(outRow, c).Value2 = s
    }
    
    Console.log("OK!");
}

function 填充金额()
{
	SubTotal("3", 
			6, 
			80, 
			7, 
			100, 
			6, 
			82
	);
}

//'=================================================================
//' SumCol (c) 2014 by x01
//'-----------------------
//'   计算指定列的合计数，如数量合计，码洋合计等，用于手工表。
//'
//' 参数：
//'   sheet: 所选的表。
//'   col: 指定的列。t1为第7列
//'   startRow: 开始的行数。
//'   endRow: 结束的行数。
//' 示例：
//'       sumcol sheet26,7,1,3000
//'=================================================================
function SumCol(sheet_name, col, startRow, endRow) 
{
	let wb = ThisWorkbook;
	let sheet = wb.Sheets(sheet_name);
	
    var result = 0
    for (var i = startRow; i <= endRow; i++) {
    	var val = sheet.Cells(i, col).Value();
    	if (isNaN(val)) continue;       
    	var hj = sheet.Cells(i, 1).Value()
    	if ((typeof hj == "string") && hj.trim()  == "合计")    
            result += val;      
    }
    Console.log(result);
}
   
 function 手工合计()
 {
 	SumCol("1",7,1,3000);
 } 
 
// '================================================================
//' DelRow (c) 2014 by x01
//'-----------------------
//'   根据列 col 的值删除行。
//' sheet_name: 所选的表名称。
//' col: 指定的条件列，默认为 0 时删除整行。t1 为第7列
//' startRow: 开始行。
//' endRow: 结束行。
//'================================================================
function DelRows(sheet_name, col, startRow, endRow)
{
	let wb = ThisWorkbook;
	let sheet = wb.Sheets(sheet_name);
	
   for (var i = endRow; i>= startRow; i--) {
   		var val = sheet.Cells(i, col).Value2
   		if (isNaN(val)) continue        
   		if (val == 0) {        	
        	sheet.Rows(i).Delete()
        } 	
    }
    
    Console.log("删除空行 OK!")
}

function 删除空行()
{
	DelRows("3",
			93,
			1,
			1000)
}


function main()
{
	Console.log("注意: 4万行约需30分钟, 录入中不要操作 excel, 容易崩溃, 录入后请及时保存!");
	
//	填充单列();	
//	填充九丘网();
}